import java.io.IOException;
import java.net.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User:岁亮亮
 * Date:2024-10-23
 * TIME:11:20
 */
public class UdpEchoClient {

    //首先也先定义一个操作网卡收发数据的socket对象
    private DatagramSocket socket = null;
    //对服务器发送请求的时候必须指定目的IP和目的端口 才能确定发送的数据到达指定的服务器
    private String severeIP;
    private int port;
    //客户端一般不会手动指定端口号 都是操作系统 随机分配一个空闲的端口号 不会对双方的通信产生影响
    //举个例子 食堂餐厅中 每次都去10号档口去打饭 ,10号档口相当于服务器,而我每次坐的位置都不相同,座位就相当于客户端的端口号 都是随机分配的
    //如果打饭的10号档口改变了位置 不会通知我,我去打饭的时候也就找不到10号档口了
    public UdpEchoClient(String severeIP,int port) throws SocketException {
        socket = new DatagramSocket();
        this.severeIP = severeIP;
        this.port = port;
    }

    public void start() throws IOException {
        System.out.println("客户端启动 ");
        Scanner scanner = new Scanner(System.in);
        while(true){
            //1. 从控制器 中 接受到应用层要向服务器发的请求
            //2. 接收请求
            //3.构造发送请求的单位即UDP数据报 并发送
            //4.接收响应 并打印到控制器上
            System.out.print("-->");
            if(!scanner.hasNext()){
                break;
            }
            //读取字符串的时候用next()方法来接收请求 而不是nextLine()方法 nextLine 来接受请求是需要按回车键的即enter 而enter不仅仅只有/n的意思 还有其他的意思
            //读入了其他数据可能就会导致读取字符串 内容发生改变 进一步导致服务端做出的响应也就不同.
            String request = scanner.next();
            //构造发送请求的UDP数据报 构造的时候将request字符串转换成字节数组传进出,
            // 在指定多少个字节 而不是request.length()这个得到的是字符串有多少个字符而不是字节数
            //然后在指定IP和端口号
            DatagramPacket requestPacket = new DatagramPacket(request.getBytes(StandardCharsets.UTF_8),request.getBytes().length
                                                              , InetAddress.getByName(severeIP),this.port);
            socket.send(requestPacket);

            DatagramPacket reponsePacket = new DatagramPacket(new byte[512],512);
            socket.receive(reponsePacket);
            String reponse = new String(reponsePacket.getData(),0,reponsePacket.getLength());
            System.out.println(reponse);
        }
    }

    public static void main(String[] args) throws IOException {
        UdpEchoClient client = new UdpEchoClient("127.0.0.1",9090);
        client.start();

    }

}
